package com.cc.eds.model;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import lombok.Getter;
import lombok.Setter;
import org.dromara.hutool.core.text.StrUtil;

import java.lang.reflect.Field;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * zip_index_xml bcp文件->表的映射关系
 *
 * @author aa
 * @since 2025/8/3
 */
@Getter
@Setter
@XStreamAlias("DATA")
public class DataInfo {

    @XStreamImplicit
    private List<Item> itemList;

    @XStreamImplicit
    private List<DataSet> datasetList;

    /**
     * 表名
     */
    private String tableName;

    private transient Field[] declareFieldArr;


    /**
     * 获取item
     */
    private Item getItemByIk(String itemKey) {
        for (Item item : itemList) {
            if (item.getKey().equals(itemKey)) {
                return item;
            }
        }
        return null;
    }

    /**
     * 获取item的val
     */
    public String getValByIk(String itemKey) {
        Item item = getItemByIk(itemKey);
        return item == null ? null : item.getVal();
    }

    /**
     * 获取表名
     */
    public String getTableName() {
        if (tableName == null && (tableName = getValByIk(Eds.TABLE_NAME_IK)) != null) {
            tableName = tableName.toLowerCase();
        }
        return tableName;
    }

    /**
     * 获取列分隔符
     */
    public Pattern getColumnSeparator() {
        String columnSeparator = getValByIk(Eds.COLUMN_SEPARATOR_IK);
        return StrUtil.isEmpty(columnSeparator) ? Eds.COLUMN_SEPARATOR_DEFAULT : Pattern.compile(columnSeparator);
    }

    /**
     * 获取行分隔符
     */
    public Pattern getLineSeparator() {
        String lineSeparator = getValByIk(Eds.LINE_SEPARATOR_IK);
        return StrUtil.isEmpty(lineSeparator) ? Eds.LINE_SEPARATOR_DEFAULT : Pattern.compile(lineSeparator);
    }

    /**
     * 获取数据起始行
     */
    public int getStartingLine() {
        String startingLine = getValByIk(Eds.STARTING_LINE_IK);
        return StrUtil.isEmpty(startingLine) ? Eds.STARTING_LINE_DEFAULT : Integer.parseInt(startingLine);
    }

    /**
     * 获取字符集
     */
    public Charset getCharset() {
        String charset = getValByIk(Eds.CHARSET_IK);
        if (StrUtil.isEmpty(charset)) {
            return StandardCharsets.UTF_8;
        } else {
            try {
                return Charset.forName(charset);
            } catch (Exception e) {
                return StandardCharsets.UTF_8;
            }
        }
    }

    /**
     * 获取dataset
     */
    public DataSet getDatasetByDn(String datasetName) {
        for (DataSet dataset : datasetList) {
            if (dataset.getName().equals(datasetName)) {
                return dataset;
            }
        }
        throw new RuntimeException(String.format("zip_index.xml解析异常,找不到dataset:%s", datasetName));
    }

    /**
     * 获取对应的bcp文件
     */
    public List<Path> getBcpFileList(Path bcpDirPath) {
        //获取bcp文件信息对应的dataset
        DataSet bcpFileDataset = getDatasetByDn(Eds.EDS_FILE_DN);
        //遍历dataset中的dataInfo返回pathList
        return bcpFileDataset.getDataInfoList().stream().map(dataInfo -> {
            String secondDir = dataInfo.getValByIk(Eds.EDS_FILE_PATH_IK);
            if (StrUtil.isNotEmpty(secondDir)) {
                return bcpDirPath.resolve(secondDir + "/" + dataInfo.getValByIk(Eds.EDS_FILE_NAME_IK));
            }
            return bcpDirPath.resolve(dataInfo.getValByIk(Eds.EDS_FILE_NAME_IK));
        }).collect(Collectors.toList());
    }

    /**
     * 获取当前表的总数据量
     */
    public int getBcpFileDataSize() {
        //获取bcp文件信息对应的dataset
        DataSet bcpFileDataset = getDatasetByDn(Eds.EDS_FILE_DN);
        //遍历dataset中的dataInfo返回总数据量
        return bcpFileDataset.getDataInfoList().stream().mapToInt(dataInfo -> Integer.parseInt(dataInfo.getValByIk(Eds.EDS_FILE_DATA_SIZE_IK))).sum();
    }

    /**
     * 获取对应的字段
     */
    public String[] getBcpFieldNameArr() {
        List<Item> bcpFieldList = getDatasetByDn(Eds.EDS_FIELD_DN).getDataInfoList().get(0).getItemList();
        return bcpFieldList.stream().map(item -> item.getEng().toLowerCase()).toArray(String[]::new);
    }

    public String[] getBcpFieldNameZhArr() {
        List<Item> bcpFieldList = getDatasetByDn(Eds.EDS_FIELD_DN).getDataInfoList().get(0).getItemList();
        return bcpFieldList.stream().map(Item::getChn).toArray(String[]::new);
    }



}
